/**
* \file		ArbreTech.h
* \brief	Définit l'arbre des technologies
* \details	C'est ici que sont définis la structure ArbreTech, ses
*		accesseurs, ses mutateurs, ses fonctions diverses.
*/

#ifndef ARBRETECH_H
#define ARBRETECH_H
#include <stdio.h>
#include "SousArbre.h"
#include "Technologie.h"

/**
* \brief	Informations définissant un Arbre des Technologies.
* \details	Structure regroupant des pointeurs menant, à plus ou moins
		long terme, aux différentes technologies développables dans le
		jeu. Ces données sont chargées à partir du fichier Tech, placé
		dans Data.
*/

typedef struct
{
   SousArbre *pRecolte;		/*!<pointeur vers le sous-arbre des
				développements affectant majoritairement la
				récolte et la création des ressources */
   SousArbre *pPop;		/*!<pointeur vers le sous-arbre des
				développements affectant majoritairement les
				variables jouant sur l'évolution de la
				population */
   SousArbre *pMilit;		/*!<pointeur vers le sous-arbre des
				développement affectant majoritairement
				l'aspect militaire du clan*/
} ArbreTech;


/*========================== Gestion de la mémoire ==========================*/
/**
* \brief	Initialise un arbre des technologies
* \details	Met les différents pointeurs sur NULL
* \param	pAT		Pointeur vers l'arbre des technologies à
*				initialiser
*/
void initArbreTech(ArbreTech *pAT);

/**
* \brief	Crée un arbre des technologies
* \details	Crée un arbre des technologies, réserve la mémoire nécessaire
*		pour le stocker dans le tas et l'initialise grâce à
*		initArbreTech.
* \param	pAT		Pointeur sur l'adresse d'un arbre donné
*/
void creerArbreTech(ArbreTech **ppAT);

/**
* \brief	Libère la mémoire allouée pour les branches de l'arbre donné
* \details	Met à NULL tous les Pointeurs, désalloue la mémoire réservée
*		initialement pour les branches de l'arbre.
* \param	pAT		Pointeur vers l'arbre des technologies à
*				libérer
*/
void libereArbreTech(ArbreTech *pAT);

/**
* \brief	Libère la mémoire allouée pour un arbre des technologies donné
* \param	pAT		Pointeur vers l'arbre à détruire
*/
void detruireArbreTech(ArbreTech *pAT);

/*========================== Création de l'arbre ==========================*/
/**
* \brief	Crée un arbre des technologies à partir d'un fichier donné
* \details	Charge les différentes données contenues dans le fichier de
*		données et crée l'arbre des technologies à l'aide de
*		creerDepuisFichierSousArbre.
* \param	ppAT		Pointeur vers l'adresse de l'arbre des
*				technologies à créer
* \param	fichierData	Chaîne de caractères, nom du fichier
*				contenant les données. A noter que ce fichier
*				doit obligatoirement se trouver dans le
*				répertoire data.
*/
void creerDepuisFichierArbreTech(ArbreTech **ppAT, char *fichierData);

/**
* \brief    Finit la création de l'arbre des technologies donné
* \details  Remplit la table des liens vers les technologies débloquées
*       si nécessaire
* \param    pAT         Pointeur vers l'Arbre des technologies à achever
*/
void finitionsArbreTech(ArbreTech *pAT);

/*============================= Accesseurs =============================*/
/**
* \brief	Etant donné un arbre des technologies, retourne le sous-arbre
*		contenant les technologies affectant la récolte
* \return	Un sous-arbre
* \param	pAT		Pointeur vers un arbre des technologies
*/
SousArbre *getRecolteArbreTech(const ArbreTech *pAT);

/**
* \brief	Etant donné un arbre des technologies, retourne le sous-arbre
*		contenant les technologies affectant la Population
* \return	Un sous-arbre
* \param	pAT		Pointeur vers un arbre des technologies
*/
SousArbre *getPopArbreTech(const ArbreTech *pAT);

/**
* \brief	Etant donné un arbre des technologies, retourne le sous-arbre
*		contenant les technologies affectant la l'aspect militaire du
*		clan
* \return	Un sous-arbre
* \param	pAT		Pointeur vers un arbre des technologies
*/
SousArbre *getMilitArbreTech(const ArbreTech *pAT);

/**
* \brief	Renvoie un pointeur vers la Technologie de l'ID donnée
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
Technologie *getTechDepIDArbreTech(const ArbreTech *pAT, int ID);

/*================= Accéder aux données d'une technologie =================*/
/**
* \brief	Retourne le nom d'une Technologie donnée
* \return	Une chaîne de caractères
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
char *getNomDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne la description d'une Technologie donnée
* \return	Une chaîne de caractères
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
char *getDescriptionDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le coût en bois d'une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getCoutBoisDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le coût en métal d'une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getCoutMetalDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le coût en bière d'une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getCoutBiereDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le coût en nourriture d'une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getCoutNourritureDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus d'attaque apporté par une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusAttaqueDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus de défense apporté par une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusDefenseDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus en fécondité apporté par une technologie
*		donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusFeconditeDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus apporté par une technologie donnée sur la
*		mortalité de la population (ces valeurs seront probablement
*		négatives)
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusMortaliteDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus apporté par une technologie donnée sur
*		l'immigration
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusImmigrationDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus apporté par une technologie donnée sur
*		l'émigration de la population (ces valeurs seront probablement
*		négatives)
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusEmigrationDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus apporté par une technologie donnée sur
*		le moral de la population
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusMoralDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le bonus apporté par une technologie donnée sur
*		la vitesse de production
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getBonusProdDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus d'attaque apporté par une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusAttaqueDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus de défense apporté par une technologie donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusDefenseDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus en fécondité apporté par une technologie
*		donnée
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusFeconditeDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus apporté par une technologie donnée sur la
*		mortalité de la population (ces valeurs seront probablement
*		négatives)
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusMortaliteDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus apporté par une technologie donnée sur
*		l'immigration
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusImmigrationDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus apporté par une technologie donnée sur
*		l'émigration de la population (ces valeurs seront probablement
*		négatives)
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusEmigrationDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus apporté par une technologie donnée sur
*		le moral de la population
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusMoralDepIDArbreTech(const ArbreTech *pAT, int ID);

/**
* \brief	Retourne le malus apporté par une technologie donnée sur
*		la vitesse de production
* \return	Un entier
* \param	pAT		Pointeur vers un arbre des technologies
* \param	ID		Entier, ID de la technologie cherchée
*/
int getMalusProdDepIDArbreTech(const ArbreTech *pAT, int ID);

/*============================= Mutateurs =============================*/
/**
* \brief	Remplace le pointeur vers le sous-arbre des technologies de
*		récolte d'un arbre donné par un pointeur donné
* \param	pAT		Pointeur vers un arbre des technologies
* \param	pSA		Pointeur vers un sous-arbre
*/
void setSARecolteArbreTech(ArbreTech *pAT, SousArbre *pSA);

/**
* \brief	Remplace le pointeur vers le sous-arbre des technologies
*		affectant la population du clan d'un arbre donné par un
*		pointeur donné
* \param	pAT		Pointeur vers un arbre des technologies
* \param	pSA		Pointeur vers un sous-arbre
*/
void setSAPopArbreTech(ArbreTech *pAT, SousArbre *pSA);

/**
* \brief	Remplace le pointeur vers le sous-arbre des technologies
*		militaires d'un arbre donné par un pointeur donné
* \param	pAT		Pointeur vers un arbre des technologies
* \param	pSA		Pointeur vers un sous-arbre
*/
void setSAMilitArbreTech(ArbreTech *pAT, SousArbre *pSA);

/*========================== Fonctions autres ==========================*/
/**
* \brief	Développe une technologie dont on aura passé l'ID
* \details	Edite le champ dev de la technologie dont on a passé l'ID et
*		le tableau de prérequis des technologies qui la nécessitent
* \param	pAT		Pointeur vers un arbre des technologies
* \param	pSA		Pointeur vers un sous-arbre
* \param        modificateurs   Tableau des differents modificateurs de la technologie
*/
void devTechArbreTech(ArbreTech *pAT, int IDTech, int modificateurs[8]);

/*=========================== Fonctions de Test ===========================*/

/**
* \brief	Teste les différentes fonctions du module ArbreTech
* \details	Teste les différentes fonctions du module ArbreTech en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testArbreTech();

#endif
